1.- Describiendo las misiones Kepler y K2
Kepler es decima mision espacial perteneciente al programa Discovery de la NASA, pero independiente a los propositos generales de esta, que fue lanzada el 7 de marzo de 2009 con un presupuesto de 550 millones de dolares. El objetivo de la misión Kepler es detectar planetas extrasolares, poniendo enfasis en planetas rocosos con tamaños similares, mediante el análisis de curvas de luz de estrellas. Kepler ha encontrado hasta la fecha 2329 planetas extrasolares en 1647 estrellas y 9 de estos planetas están en las zonas habitables de sus estrellas.
KOI (Kepler Object of Interest / Objetos de Interes de Kepler) son estrellas que fueron observadas por el satélite Kepler, que son de interes para continuar observándose, ya que probablemente posean planetas en órbitas.
KIC (Kepler Input Catalog / Catálogo en Entrada de Kepler) es una base de datos de cerca de 13,2 millones de estrellas las cuales Kepler puede observar, si la estrella presenta indicios de algun tránsito, entonces, se clasifica como un KOI.
La misión K2 entró en funcionamiento en junio de 2014 como respuesta a los desperfectos que tuvo la nave de la misión Kepler en dos de sus ruedas de reacción. Está destinada a hacer observaciones en el plano de la eclíptica.
EPIC (K2 Ecliptic Plane Input Catalog / Catálogo de entrada en el Plano de la Eclítica de K2) es un catálogo análogo a lo que era KOI para la misión Kepler. El propósito principal del catálogo es definir aperturas fotométricas para cada objetivo potencial proporcionando posiciones celestes y magnitudes de pasabanda Kepler.
Fuentes:
http://keplerscience.arc.nasa.gov/K2/ProposeTargets.shtml
https://keplerscience.arc.nasa.gov/objectives.html
https://en.wikipedia.org/wiki/Kepler_Input_Catalog
http://www.publico.es/ciencias/mision-kepler-nasa-anuncia-descubrimiento.html
2.- Obteniendo curvas de luz
Para obtener las curvas de luz se usó el módulo kplr
In [1]:
import kplr
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
client = kplr.API()
star1 = client.star(2305930)
curva1 = star1.get_light_curves(short_cadence=False)
time1, flux1, ferr1, quality1 = [], [], [], []
for lc in curva1:
with lc.open() as f:
hdu_data = f[1].data
times1 = hdu_data["time"]
pdc_fluxes1 = hdu_data["pdcsap_flux"]
qualities1 = hdu_data["sap_quality"]
#quitamos los elementos que sean "nan"
idx = np.isnan(pdc_fluxes1)
time1.append(times1[~idx])
flux1.append(pdc_fluxes1[~idx])
quality1.append(qualities1[~idx])
ejex1 = np.array([])
ejey1 = np.array([])
for i in range(len(time1)):
ejex1 = np.append(ejex1,time1[i])
ejey1 = np.append(ejey1,flux1[i])
sumaprom = 0
numprom = 0
uind = 0
suma = 0
prom = 0
dif = 0
#determinamos el pormedio de cada trozo discontinuo en la curva de luz
for j in range(len(ejey1)-1):
dif = ejey1[j+1] - ejey1[j]
if dif > 1500 or dif < -1500:
for k in range(j-uind):
suma = suma + ejey1[k+uind]
prom = suma / (j-uind)
sumaprom = sumaprom + prom
numprom = numprom + 1
uind = j
print(sumaprom)
print(numprom)
gprom = sumaprom/numprom
print(gprom)
uind = 0
suma = 0
prom = 0
dif = 0
#restamos a cada valor (punto) en el gráfico la diferencia entre el promedio de cada trozo y el promedio general para
#llevar los puntos a un mismo nivel. Esto corresponde a la parte 5 de la tarea.
for j in range(len(ejey1)-1):
dif = ejey1[j+1] - ejey1[j]
if dif > 2000 or dif < -2000:
for k in range(j-uind):
suma = suma + ejey1[k+uind]
prom = suma / (j-uind)
if prom < (gprom-prom):
for l in range(j-uind):
ejey1[l+uind] = ejey1[l+uind] - (gprom-prom)
if prom > (gprom-prom):
for l in range(j-uind):
ejey1[l+uind] = (gprom-prom) - ejey1[l+uind]
uind = j
#graficamos
fig, axis = plt.subplots(figsize=(8,6))
axis.plot(ejex1,ejey1,'r.',alpha=0.1)
plt.ylim(-3.41e9, -3.43e9)
axis.set_xlabel('Tiempo')
axis.set_ylabel('Flujo')
plt.show()
No se por qué no me funciona :(
Abajo se repite el procedimiento para las otras dos estrellas.
In [2]:
star2 = client.star(4348593)
curva2 = star2.get_light_curves(short_cadence=False)
time2, flux2, ferr2, quality2 = [], [], [], []
for lc in curva2:
with lc.open() as f:
hdu_data = f[1].data
times2 = hdu_data["time"]
pdc_fluxes2 = hdu_data["pdcsap_flux"]
qualities2 = hdu_data["sap_quality"]
#quitamos los elementos que sean "nan"
idx2 = np.isnan(pdc_fluxes2)
time2.append(times2[~idx2])
flux2.append(pdc_fluxes2[~idx2])
quality2.append(qualities2[~idx2])
ejex2 = np.array([])
ejey2 = np.array([])
for i in range(len(time2)):
ejex2 = np.append(ejex2,time2[i])
ejey2 = np.append(ejey2,flux2[i])
sumaprom = 0
numprom = 0
uind = 0
suma = 0
prom = 0
dif = 0
for j in range(len(ejey2)-1):
dif = ejey2[j+1] - ejey2[j]
if dif > 1500 or dif < -1500:
for k in range(j-uind):
suma = suma + ejey2[k+uind]
prom = suma / (j-uind)
sumaprom = sumaprom + prom
numprom = numprom + 1
uind = j
print(sumaprom)
print(numprom)
gprom = sumaprom/numprom
print(gprom)
uind = 0
suma = 0
prom = 0
dif = 0
for j in range(len(ejey2)-1):
dif = ejey2[j+1] - ejey2[j]
if dif > 2000 or dif < -2000:
for k in range(j-uind):
suma = suma + ejey2[k+uind]
prom = suma / (j-uind)
if prom < (gprom-prom):
for l in range(j-uind):
ejey2[l+uind] = ejey2[l+uind] - (gprom-prom)
if prom > (gprom-prom):
for l in range(j-uind):
ejey2[l+uind] = (gprom-prom) - ejey2[l+uind]
uind = j
fig, axis = plt.subplots(figsize=(8,6))
axis.plot(ejex2,ejey2,'r.',alpha=0.1)
plt.ylim(-0.184e11,-0.18e11)
axis.set_xlabel('Tiempo')
axis.set_ylabel('Flujo')
plt.show()
In [3]:
star3 = client.star(9469165)
curva3 = star3.get_light_curves(short_cadence=False)
time3, flux3, ferr3, quality3 = [], [], [], []
for lc in curva3:
with lc.open() as f:
hdu_data = f[1].data
times3 = hdu_data["time"]
pdc_fluxes3 = hdu_data["pdcsap_flux"]
qualities3 = hdu_data["sap_quality"]
#quitamos los elementos que sean "nan"
idx3 = np.isnan(pdc_fluxes3)
time3.append(times3[~idx3])
flux3.append(pdc_fluxes3[~idx3])
quality3.append(qualities3[~idx3])
ejex3 = np.array([])
ejey3 = np.array([])
for i in range(len(time3)):
ejex3 = np.append(ejex3,time3[i])
ejey3 = np.append(ejey3,flux3[i])
sumaprom = 0
numprom = 0
uind = 0
suma = 0
prom = 0
dif = 0
for j in range(len(ejey3)-1):
dif = ejey3[j+1] - ejey3[j]
if dif > 1500 or dif < -1500:
for k in range(j-uind):
suma = suma + ejey3[k+uind]
prom = suma / (j-uind)
sumaprom = sumaprom + prom
numprom = numprom + 1
uind = j
print(sumaprom)
print(numprom)
gprom = sumaprom/numprom
print(gprom)
uind = 0
suma = 0
prom = 0
dif = 0
for j in range(len(ejey3)-1):
dif = ejey3[j+1] - ejey3[j]
if dif > 2000 or dif < -2000:
for k in range(j-uind):
suma = suma + ejey3[k+uind]
prom = suma / (j-uind)
if prom < (gprom-prom):
for l in range(j-uind):
ejey3[l+uind] = ejey3[l+uind] - (gprom-prom)
if prom > (gprom-prom):
for l in range(j-uind):
ejey3[l+uind] = (gprom-prom) - ejey3[l+uind]
uind = j
fig, axis = plt.subplots(figsize=(8,6))
axis.plot(ejex3,ejey3,'r.',alpha=0.1)
plt.ylim(-1.545e9,-1.534e9)
axis.set_xlabel('Tiempo')
axis.set_ylabel('Flujo')
plt.show()
3.- Diagrama flujo versus fase
Tomamos la curva de luz de KIC5520878 y la reducimos a solo un periodo. Cada periodo tiene 0.269 dias.
In [10]:
star = client.star(5520878)
curva = star.get_light_curves(short_cadence=False)
time, flux, ferr, quality = [], [], [], []
for lc in curva:
with lc.open() as f:
hdu_data = f[1].data
times = hdu_data["time"]
pdc_fluxes = hdu_data["pdcsap_flux"]
qualities = hdu_data["sap_quality"]
#quitamos los elementos que sean "nan"
idx = np.isnan(pdc_fluxes)
time.append(times[~idx])
flux.append(pdc_fluxes[~idx])
quality.append(qualities[~idx])
ejex = np.array([])
ejey = np.array([])
for i in range(len(time3)):
ejex = np.append(ejex,time[i])
ejey = np.append(ejey,flux[i])
#graficamos los datos tal como los recibimos
fig, axis = plt.subplots(figsize=(8,6))
axis.plot(ejex,ejey,'r.',alpha=0.1)
plt.xlim(200,220)
axis.set_xlabel('Tiempo')
axis.set_ylabel('Flujo')
plt.show()
Ahora rellenamos con los puntos para llevarlo al continuo.
In [13]:
ejexn = np.array([])
ejeyn = np.array([])
for t in range(len(ejex)-1):
if ejex[t]>200 and ejex[t]<220:
ejexn = np.append(ejexn,ejex[t])
ejeyn = np.append(ejeyn,ejey[t])
print(ejexn[10])
print(ejexn[22])
#se tomó ese promedio viendo la diferencia entre dos cimas en el gráfico de arriba
print("El periodo aproximado segun los datos es:", ejexn[22]-ejexn[10], "que es bastante próximo a lo de la literatura")
#Ahora se completa el diagrama"
for t in range(len(ejexn)-1):
if ejexn[t]>0 and ejexn[t]<20:
ejexn = np.append(ejexn,ejexn[t]+0,269)
ejeyn = np.append(ejeyn,ejeyn[t])
fig, axis = plt.subplots(figsize=(8,6))
axis.plot(ejexn,ejeyn,'g.',alpha=0.1)
plt.xlim(219.462,220)
axis.set_xlabel('Tiempo')
axis.set_ylabel('Flujo')
plt.show()
4.- Comparando con parámetros estelares
Tomamos
In [ ]: